/*
 * The RavenX Library
 * Copyright (c) 2008 by Solidus
 * 
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Hewlett-Packard Company makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 */

#ifndef RX_BITVEC_H
#define RX_BITVEC_H

#include "rx_typedef.h"



RX_SPACE_BEG


typedef struct __rx_bitvec_tag rx_bitvec_t;



RavenAPI rx_bitvec_t*		rx_bitvec_create(size_t nbits, const rx_alloc_t *palloc);

RavenAPI rx_bitvec_t*		rx_bitvec_create_from(const rx_byte *data, size_t nbits, const rx_alloc_t *palloc);

RavenAPI void				rx_bitvec_destroy(rx_bitvec_t *self);

RavenAPI rx_bitvec_t*		rx_bitvec_copy(const rx_bitvec_t* self);

RavenAPI void	rx_bitvec_change(rx_bitvec_t *self, size_t new_bits);

RavenAPI void				rx_bitvec_swap(rx_bitvec_t* a, rx_bitvec_t *b);

RavenAPI size_t				rx_bitvec_nbits(const rx_bitvec_t* self);

RavenAPI size_t				rx_bitvec_nbytes(const rx_bitvec_t* self);

RavenAPI const rx_byte*		rx_bitvec_data(const rx_bitvec_t* self);



RavenAPI rx_bool			rx_bitvec_isset(const rx_bitvec_t *self, size_t idx);

RavenAPI void				rx_bitvec_set(rx_bitvec_t *self, size_t idx);

RavenAPI void				rx_bitvec_unset(rx_bitvec_t *self, size_t idx);

RavenAPI void				rx_bitvec_flip(rx_bitvec_t *self, size_t idx);

RavenAPI void				rx_bitvec_not(rx_bitvec_t *self);

RavenAPI void				rx_bitvec_not_to(const rx_bitvec_t *self, rx_bitvec_t *out);

RavenAPI size_t				rx_bitvec_count(const rx_bitvec_t *self);

RavenAPI void				rx_bitvec_clear(rx_bitvec_t *self);

RavenAPI rx_bool			rx_bitvec_is_equal(const rx_bitvec_t *self, const rx_bitvec_t *other);

RavenAPI void				rx_bitvec_and(rx_bitvec_t *self, const rx_bitvec_t *b);

RavenAPI void				rx_bitvec_or(rx_bitvec_t *self, const rx_bitvec_t *b);

RavenAPI void				rx_bitvec_xor(rx_bitvec_t *self, const rx_bitvec_t *b);



RavenAPI void				rx_bitvec_and_to(const rx_bitvec_t *a, const rx_bitvec_t *b, rx_bitvec_t *out);

RavenAPI void				rx_bitvec_or_to(const rx_bitvec_t *a, const rx_bitvec_t *b, rx_bitvec_t *out);

RavenAPI void				rx_bitvec_xor_to(const rx_bitvec_t *a, const rx_bitvec_t *b, rx_bitvec_t *out);



RavenAPI void				rx_bitvec_ls(rx_bitvec_t *self, size_t nbits);

RavenAPI void				rx_bitvec_rs(rx_bitvec_t *self, size_t nbits);

RavenAPI void				rx_bitvec_ls_to(const rx_bitvec_t *self, size_t nbits ,rx_bitvec_t *out);

RavenAPI void				rx_bitvec_rs_to(const rx_bitvec_t *self, size_t nbits, rx_bitvec_t *out);

RavenAPI rx_int_n			rx_bitvec_first_unset(const rx_bitvec_t *self);


RX_SPACE_END



#endif

